<?php

namespace PolarisbackEndFrameRe\api\engine;

/**
 * 静态模板引擎
 * @author TINUOKAS1/Astoflow
 */
class Template
{
    private $template;
    private $replace_string;
    private $process_result;

    /**
     * 调用这个去使用模板
     * @return void
     */
    public function __construct($template_contents, $replace_string)
    {
        $this->template = $template_contents;
        $this->replace_string = $replace_string;
    }

    /**
     * 处理模板
     */
    public function TemplateProcess()
    {
        // 使用正则表达式匹配 {{ }} 占位符
        $this->process_result = preg_replace_callback('/\{\{(.*?)\}\}/', function ($matches) {
            // 获取占位符名称
            $placeholder = $matches[1];

            // 从数据源中获取对应的值
            $value = $this->GetValueFromData($placeholder, $this->replace_string);

            // 对值进行XSS防护处理
            $safe_value = $this->escapeForXSS($value);

            // 如果找到对应的值，返回该值；否则返回原始占位符
            return $safe_value !== null ? $safe_value : $matches[0];
        }, $this->template);

        return $this->process_result;
    }

    /**
     * 数组嵌套
     */
    private function GetValueFromData($key, $data)
    {
        $keys = explode('.', $key);
        $current = $data;

        foreach ($keys as $k) {
            if (is_array($current) && array_key_exists($k, $current)) {
                $current = $current[$k];
            } else {
                return null;
            }
        }

        return $current;
    }

    /**
     * 转义输出以防止XSS
     */
    private function escapeForXSS($value)
    {
        if (is_null($value)) {
            return null;
        }

        // 转义HTML特殊字符
        return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
    }
}